# -*- coding: utf-8 -*-
"""
------------------------------------------------------------------------------
    File Name:  RedisDemo
    Author   :  wanwei1029
    Date     :  2018/9/29
    Desc     : Counter 类是dict的子类，主要用来计数使用。无序的。请求一个不存在的
                元素，会返回为0，设置一个元素为0不会删除该元素，要删除只能用del
------------------------------------------------------------------------------
"""
from collections import Counter
import samp.samp_logging as sl

logger = sl.get_logger('CounterDemo')


def samp():
    # 通过一个可迭代对象创建，会统计里面元素的个数
    a = Counter("abcaaegg")
    logger.info(a)
    # 通过dict来创建Counter,value要为数字，非数字创建的时候不会报错，但使用，比如sorted时，会报错
    b = Counter({"a": 3, "b": -1, "c": 5, "d": "error"})
    logger.info(b)
    # 也可以通过关键字来创建,同上，为其它类型也不会报错，注意，此时a,b是变量，不要加引号，会报错。
    c = Counter(a=3, b=4)
    logger.info(c)

    # 常用方法之elements(),返回元素的iterator,注意会过滤掉小于1的元素，另外元素有多少个，就会迭代多少次。
    # 非数字元素要删除，要不sorted会报错
    del b["d"]
    logger.info(sorted(b.elements()))

    # 常用方法之most_common(n),返回数量最高的n的元素
    logger.info(b.most_common(1))

    # 常用方法：subtract，可以将两个Counter相减。另外,Counter支持+,-,&,|等操作。
    # 其中，& 取相同元素的最小值min(c[x], d[x]) | 取相同元素的最大值 max(c[x], d[x])
    c.subtract(b)
    logger.info(c)

    # Counter 支持一些基本的内置方法和转换
    logger.info(sum(b.values()))  # 计算所有个数之和
    c.clear()   # 清空所有元素
    logger.info(c)
    logger.info(list(b))  # 将key转换为list,set 和dict
    logger.info(set(b))
    logger.info(dict(b))
    logger.info(b.items())  # 返回元素


if __name__ == '__main__':
    test_method = "samp"
    if test_method == "samp":
        samp()
